package com.xiaode.util;

import com.jfinal.plugin.redis.Cache;
import com.jfinal.plugin.redis.Redis;
import com.xiaode.common.constant.Const;
import com.xiaode.common.model.MarkLog;
import com.xiaode.common.model.Student;

import cn.hutool.core.bean.BeanUtil;

public class UserUtil {

    /**
     * 给学生添加积分
     * 事件类型 2.当天锻炼打卡 4.普通任务得分 5.活动得分 6.日常劳动 7.职业体验 8.重要他人 9.活动参与得分（任务）
     * 事件id为对应完成的内容id(有学生做的表，则用做的id)
     */
     public static void addScoreForStu(Integer stuId, Integer scoreChange, Integer eventType, Integer eventId) {
         Cache redis = Redis.use();
         //更新数据库用户积分信息
         Student stu = Student.dao.findById(stuId);
         stu.setZScore(stu.getZScore() + scoreChange);
         stu.update();
         //添加数据库记录
         MarkLog markLog = new MarkLog();
         markLog.setBefore(stu.getZScore());
         markLog.setStudentId(stuId);
         markLog.setVariable(scoreChange);
         markLog.setEventType(eventType);
         markLog.setEventId(eventId);
         markLog.save();
         //跟新redis中用户对象积分数据
         Student o = redis.get(Const.user.Student + stu.getId());
         o.setZScore(stu.getZScore());
         redis.set(Const.user.Student + stu.getId(), o);
         //跟新学生分数排名
         redis.zadd(Const.user.StudentScore, stu.getZScore(), stu.getId());
         //判断是否登录，登录了的话跟新redis登录用户中学生分数信息
         boolean exists = redis.exists(Const.user.loginStudent + stu.getAccountId());
         if (exists) {
             Student stuInfo = redis.get(Const.user.loginStudent + stu.getAccountId());
             stuInfo.setZScore(stu.getZScore());
             redis.setex(Const.user.loginStudent + stu.getAccountId(), Const.user.timeToLiveSeconds, stuInfo);
         }
     }

     public static void addScoreForStuDeleteLog(Integer stuId, Integer eventType, Integer eventId) {
         Cache redis = Redis.use();
         MarkLog markLog = MarkLog.dao.findFirst("SELECT * FROM mark_log WHERE studentId = ? AND eventType = ? AND eventId = ?", stuId, eventType, eventId);
         if(BeanUtil.isNotEmpty(markLog)) {
        	 int scoreChange = (~(markLog.getVariable() - 1));//转附属
             //更新数据库用户积分信息
             Student stu = Student.dao.findById(stuId);
             stu.setZScore(stu.getZScore() + scoreChange);
             stu.update();
             //跟新redis中用户对象积分数据
             Student o = redis.get(Const.user.Student + stu.getId());
             o.setZScore(stu.getZScore());
             redis.set(Const.user.Student + stu.getId(), o);
             //跟新学生分数排名
             redis.zadd(Const.user.StudentScore, stu.getZScore(), stu.getId());
             //判断是否登录，登录了的话跟新redis登录用户中学生分数信息
             boolean exists = redis.exists(Const.user.loginStudent + stu.getAccountId());
             if (exists) {
                 Student stuInfo = redis.get(Const.user.loginStudent + stu.getAccountId());
                 stuInfo.setZScore(stu.getZScore());
                 redis.setex(Const.user.loginStudent + stu.getAccountId(), Const.user.timeToLiveSeconds, stuInfo);
             }
             //删除数据库记录
             markLog.delete();
         }
     }

    /**
     * 架构权限
     * @param admin
     * @return
     */
//    public static Set<Integer> frameworkPermission(Admin admin) {
//        List<OrgAdmin> orgAdmins = OrgAdmin.dao.find("SELECT stratum,adminId,stratumId FROM org_admin WHERE adminId = ?", admin.getId());
//        HashSet<Integer> hashSet = new HashSet<>();
//        for (OrgAdmin orgAdmin : orgAdmins) {
//            Integer stratum = orgAdmin.getStratum();
//            if (stratum == 1) {
//                List<OrgClass> orgClass = OrgClass.dao.find("SELECT id FROM org_class");
//                Set<Integer> collect = orgClass.stream().map(orgClass1 -> orgClass1.getId()).collect(Collectors.toSet());
//                hashSet.addAll(collect);
//                break;
//            } else if (stratum == 2) {
//                List<OrgClass> orgClasses = OrgClass.dao.find("SELECT id FROM org_class WHERE adminGradeId = ?", orgAdmin.getStratumId());
//                Set<Integer> collect = orgClasses.stream().map(orgClass -> orgClass.getId()).collect(Collectors.toSet());
//                hashSet.addAll(collect);
//            } else {
//                OrgClass orgClass = OrgClass.dao.findById(orgAdmin.getStratumId());
//                if (orgClass != null) {
//                    hashSet.add(orgClass.getId());
//                }
//            }
//        }
//        return hashSet;
//    }
     
     
}
